<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //  var a=5;

        // function fn1(){
        //     var b=15;
        //     b++;
        //     a++;
        //     console.log(a);
        //     console.log(b);
        // }
        // fn1();
   
       
       
        // var a=4;
        // function fn1(){
        //     var a=5;
        //     console.log(a); 
        // }
        // fn1();
        // 输出结果为5，正常调用fn1
   
        // var a=4;
        // function fn1(){
            
        //     console.log(a); 
        //     var a=5; 
        // }
        // fn1();
        // 输出结果为undefined，因为在函数中未定义就掉调用
  
        // var a=4;
        // function fn1(){
        //     console.log(a);
        //      a=5;//全局 
        // }
        // fn1();  
//   输出结果为4，较上一个区别是函数中的a没有定义，属于全局变量，并且赋值
//   所以赋值后的a不能当做变量，不能调用，调用局部变量定义的a
  
        // var a=5;
        // function fn1(){

        //     if(a==undefined){
        //         var a=6;
        //     }else{
        //          a=7;
        //     }
        //     console.log(a);
        // }
        // fn1();
        // console.log(a);
//   输出结果为6和5，第一个值是fn1调用函数，由于变量先调用后定义，所以a的值先为
//   undefined，进入if条件，a等于6。
//   第二个是属于全部变量，不能进入函数，所以a等于5
  
  
  
    //     var a=5;
    //     function fn1(){
    //         var a=10;
    //         console.log(a+window.a);
    //      }

    //      fn1();
    //  因为全局变量建立在window中，所以可以调用，结果为15    
  
    // function fn1(a){
    //         if(a===undefined) a=1;
    //         a++;
    //     //    var sum=fn2(a); 替换方式舍弃
    //        return fn2(a);
    //     }

    //     function fn2(a){
    //         a*=2;
    //     //    var s=fn3(a);替换方式舍弃
    //        return fn3(a);
    //     }

    //     function fn3(a){
    //         a+=5;
    //         return a;
    //     }
    
    //   var s=fn1();
    //   console.log(s);
    //     值为9，在调用时由于没有定义所以进去函数，计算结果后进入return 后面的fn2(a)
    // 再进入fn3，最后在fn3中，return将结果返回给fn3，之后进入fn2中的return，再进入fn1，返回给s
  
  
        // var a=5;

        // function fn1(a){
        //     a++;
        //     console.log(a);
        // }
        // fn1(a);
        // console.log(a);
        
        // 值是6和5，全局变量和局内变量的原理
    
    
    
    // a(5);
    // var a=6;
    // function a(a){
    //     console.log(a);
    //     if(a==10){
    //         var a=6;
    //     }else{
    //         a=8
    //     }
    //     console.log(a);
    // }
    // 这个时候把a里边的5带进去，进而判断，结果是5和8
    
    // var a=6;
    // a(a);   
    // function a(a){
    //     console.log(a);
    //     if(a==10){
    //         var a=6;
    //     }else{
    //         a=8
    //     }
    //     console.log(a);
    // }
    // 报错，函数首先会被执行，匿名函数将a定义,当执行到
    // var a=6;时，原先定义的a被覆盖，识别之前的a时，报出a不是一个函数



    // var a
    // a(a);
    // function a(a){
    //     console.log(a);
    //     if(a==10){
    //         var a=6;
    //     }else{
    //         a=8
    //     }
    //     console.log(a);
    // }
  
//  第一个输出为a函数本身，因为输出的时匿名函数a，所以输出结果为函数本身
    // 第二个输出为8，进行判断即可
  
  
    // var o={a:1};
    // function fn1(obj){
    //     obj.a=10;
    // }
    // fn1(o);
    // console.log(o);

    // 输出结果对象{a:10},将o赋值给obj，那么局部变量和全局变量引用地址一样，
    // 对obj的更改，就是对o的更改
  
  
    // var o={a:1};
    // function fn1(obj){
    //     obj={a:10}
    // }
    // fn1(o);
    // console.log(o);
    // 输出结果为{a:1}，开始引用时的地址是o的地址，当执行到obj={a:10}时，obj重新生成引用地址，
    // 之后与o{a:1}的地址不同，所以obj不影响o，所以输出就是{a:1}
  
//     var a = {n: 1}
//     var b = a
//     a.x = a = {n: 2}

//   console.log(a.n, b.n) 
//   console.log(a.x, b.x) 
  
//   答案： a.n=2 a.x=undefined  b.n=1 b.x={n:2}
//   按赋值的先后顺序进行计算，a.x={n:2}，b存在引用关系，所以b.x={n:2}，则b.n=1,b={n:1},则b.n为1
//   之后再进行a的赋值，a={n:2},则a.n=2,由于a被重新赋值，则a.x为undefined

  
// var fn = function () {
//     console.log(fn)
//   }
//   fn() 
//   打印函数自身，因为匿名函数直接输出
  
//  function b(){}
//  var b 
//  console.log(typeof b)
     
// 答案为function
   
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  </script>
</body>
</html>